package notes.java.juc.demo;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * 实现多线程的方式有 
 * 	第一种：继承Thread类
 *	第二种：实现Runnable接口
 *  第三种：实现Callable
 *  		-call方法有了返回值，runable中的run没有
 *          -有异常抛出，runable中没有
 *          -有了泛型，返回结果类型
 *          -由于有了返回值，就需要FutureTast来接收返回值
 *          -FutureTask也可以用于闭锁，当子线程处理中，task.get()获取结果时，在等待中，直到子线程执行完，才能获取结果。
 *          
 */
public class J6_TestCallable {
	
	public static void main(String[] args) throws InterruptedException, ExecutionException {
		ThreadCallable tc = new ThreadCallable();
		
		// 用于接收返回值处理的FutureTask
		FutureTask<String> result = new FutureTask<>(tc);
		
		new Thread(result).start();
		
		// 获取返回值 
		System.out.println(result.get());
	}
}

// 实现Callable接口
class ThreadCallable implements Callable<String> {

	@Override
	public String call() throws Exception {
		// 计算1....100之间的和
		int sum = 0;
		for(int i=0; i<=100;i++) {
			sum += i;
		}
		return "计算结果为：" + sum;
	}
	
}